// 小程序封装网络请求插件

class WxRequest {
  // 默认参数对象
  defaults = {
    baseURL: 'https://njrsxxzx.cn/njrs/', // 请求基准地址
    url: '', // 开发者服务器接口地址
    data: null, // 请求参数
    method: 'GET', // 默认请求方法
    // 请求头
    header: {
      'Content-type': 'application/x-www-form-urlencoded' // 设置数据的交互格式
    },
    timeout: 60000 // 小程序默认超时时间是 60000，一分钟
  }
  // 定义 constructor 构造函数，用于创建和初始化类的属性和方法
  constructor(params) {
    this.defaults = this.deepMerge(this.defaults, params)
  }
  /**
   * 深度合并
   * @param {null|boolean|number|string|Array|Object} obj1
   * @param {null|boolean|number|string|Array|Object} obj2
   * @return {null|boolean|number|string|Array|Object}
   */
  deepMerge(obj1, obj2) {
    const obj = obj1;
    const isObject = (x) => x !== null && typeof x === "object";
    const isSameObject = (o1, o2) =>
      isObject(o1) && isObject(o2) && Array.isArray(o1) === Array.isArray(o2);
    if (!isSameObject(obj, obj2)) return obj2;
    for (const key in obj2) {
      obj[key] = this.deepMerge(obj[key], obj2[key]);
    }
    return obj;
  };
  /**
   * @description 发起请求的方法
   * @param { Object} options 请求配置选项，同 wx.request 请求配置选项
   * @returns Promise
   */
  request(options) {
    options.url = this.defaults.baseURL + options.url
    options = {
      ...this.defaults,
      ...options
    }
    options.header.token = wx.getStorageSync('accessToken')
    console.log('-------请求参数--------')
    console.log(options)
    // 使用 Promise 封装异步请求
    return new Promise((resolve, reject) => {
      // 使用 wx.request 发起请求
      wx.request({
        ...options,
        // 接口调用成功的回调函数
        success: (res) => {
          console.log('-------请求返回值--------')
          console.log(res)
          if (res.statusCode == 200) {
            if (res.data.code == 9999) { 
              //登录失效的处理
              wx.showModal({
                title: '提示',
                content: '登录已过期，是否重新登录？',
                success(res) {
                  if (res.confirm) {
                    wx.navigateToMiniProgram({
                      path: '/pages/humanSociety/appBear',
                      appId: 'wx7aa6ad8c15829d96',
                      envVersion: 'trial',
                      extraData: {
                        appId: '202406040001',
                        forwardUrl: "https://rs.jshrss.jiangsu.gov.cn/mobile/person/login?appId=202406040001&returnUrl=/pages/login/index&channelType=JSHRSS_WXSP&thirdAppId=wxeee1e9fe5686a91e",
                        from: 'miniapp'
                      }
                    });
                  } else if (res.cancel) {
                    console.log('用户点击取消了')
                  }
                }
              })
            } else{
              resolve(res.data)
            }
          } else {
            wx.showToast({
              title: res.statusCode,
              icon: 'error'
            })
          }
        },
        // 接口调用失败的回调函数
        fail: (err) => {
          wx.showToast({
            title: err.errMsg,
            icon: 'error'
          })
          reject(err)
        }
      })
    })
  }
}

// ----------------- 实例化 ----------------------

// 对 WxRequest 进行实例化
const requestInstance = (option) => {
  const instance = new WxRequest(option);
  return instance;
}
// 将 WxRequest 的实例通过模块化的方式暴露出去
export default requestInstance